package com.ruoyi.classai.service.impl;


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.ruoyi.classai.domain.dto.EwcCourseDto;
import com.ruoyi.common.core.context.ThirdSessionHolder;
import com.ruoyi.classai.domain.EwcChapter;
import com.ruoyi.classai.domain.EwcClassCourse;
import com.ruoyi.classai.domain.EwcCourse;
import com.ruoyi.classai.domain.EwcCourseTeacher;
import com.ruoyi.classai.domain.dto.ClassCourseDto;
import com.ruoyi.classai.domain.vo.EwcCourseVo;
import com.ruoyi.classai.mapper.EwcCourseMapper;
import com.ruoyi.classai.service.IEwcChapterService;
import com.ruoyi.classai.service.IEwcClassCourseService;
import com.ruoyi.classai.service.IEwcCourseService;
import com.ruoyi.classai.service.IEwcCourseTeacherService;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.exception.GlobalException;
import com.ruoyi.common.core.utils.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 课程信息Service业务层处理
 * 
 * @author lcj
 * @date 2025-02-27
 */
@Service
@Transactional
public class EwcCourseServiceImpl extends MPJBaseServiceImpl<EwcCourseMapper, EwcCourse> implements IEwcCourseService {

    @Autowired
    private EwcCourseMapper courseMapper;
    @Autowired
    private IEwcCourseTeacherService courseTeacherService;
    @Autowired
    private IEwcClassCourseService classCourseServicec;
    @Autowired
    private IEwcChapterService chapterService;
    @Autowired
    private IEwcClassCourseService classCourseService;

    @Override
    public List<EwcCourseVo> getList(String teacherId,String courseName, String startTime, String endTime, String classId) {
        return courseMapper.getList(teacherId,courseName,startTime,endTime,classId );

    }

    @Override
    public List<EwcCourseVo> getCourseAssociation(String classId) {
        //查询所有课程
        List<EwcCourseVo> allCourseList=courseMapper.getList(ThirdSessionHolder.getThirdSession().getId(),null,null,null ,null);
        //查询班级课程
        List<EwcCourseVo> classCourseList=courseMapper.getList(ThirdSessionHolder.getThirdSession().getId(),null,null,null ,classId);

        return Stream.concat(
                allCourseList.stream().filter(e -> !classCourseList.contains(e)),
                classCourseList.stream().filter(e -> !allCourseList.contains(e))
        ).collect(Collectors.toList());
    }

    @Override
    public void addCourse(EwcCourseDto courseDto) {
        EwcCourse course=new EwcCourse();
        BeanUtils.copyProperties(courseDto,course);
        //课程代码
        String courseCode= RandomUtil.randomNumbers(6);
        course.setCourseCode(courseCode);
        this.save(course);
        //添加教师课程关联
        EwcCourseTeacher courseTeacher=new EwcCourseTeacher();
        courseTeacher.setCourseId(course.getId());
        courseTeacher.setTeacherId(ThirdSessionHolder.getThirdSession().getId());
        courseTeacherService.save(courseTeacher);
        //添加班级关联
        if (StringUtils.isNotEmpty(courseDto.getClassId())){
            EwcClassCourse classCourse=new EwcClassCourse();
            classCourse.setClassId(courseDto.getClassId());
            classCourse.setCourseId(course.getId());
            classCourseServicec.save(classCourse);
            //查询课程下的章节
            List<EwcChapter> chapters=chapterService.list(Wrappers.<EwcChapter>lambdaQuery()
                    .eq(EwcChapter::getCourseId,course.getId())
                    .ne(EwcChapter::getStatus,0));
            if (CollectionUtil.isNotEmpty(chapters)){
                for (EwcChapter chapter : chapters) {
                    if (StringUtils.isEmpty(chapter.getClassId())) {
                        chapter.setClassId(courseDto.getClassId());
                        chapterService.updateById(chapter);
                    }
                }
            }
        }
    }

    @Override
    public void updateCourse(EwcCourseDto courseDto) {
        //查询课程
        //EwcCourse course=this.getById(courseDto.getId());
        if (StringUtils.isNotEmpty(courseDto.getClassId())) {
            EwcClassCourse classCourse = classCourseServicec.getOne(Wrappers.<EwcClassCourse>lambdaQuery().eq(EwcClassCourse::getCourseId, courseDto.getId())
                    .eq(EwcClassCourse::getClassId, courseDto.getClassId()));
            //为空则添加课程
            if (Objects.nonNull(classCourse)&&!Objects.equals(classCourse.getClassId(),courseDto.getClassId())) {
                //删除班级课程关联
                classCourseServicec.remove(Wrappers.<EwcClassCourse>lambdaQuery().eq(EwcClassCourse::getCourseId, courseDto.getId())
                        .eq(EwcClassCourse::getClassId, courseDto.getClassId()));
            }else {
                classCourse = new EwcClassCourse();
                classCourse.setClassId(courseDto.getClassId());
                classCourse.setCourseId(courseDto.getId());
                classCourseServicec.save(classCourse);

            }
        }else { //todo 需优化

        }

        EwcCourse course1=new EwcCourse();
        BeanUtils.copyProperties(courseDto,course1);
        this.updateById(course1);

    }

    @Override
    public void deleteCourse(String id) {
        //查询是否关联
        long courseNum=classCourseService.count(Wrappers.<EwcClassCourse>lambdaQuery().eq(EwcClassCourse::getCourseId,id));
        if (courseNum>0){
            throw new GlobalException("已绑定课程,不能删除");
        }
        EwcCourse course=new EwcCourse();
        course.setId(id);
        course.setStatus(Constants.COMMON_DELETE);
        this.updateById(course);
        //删除关联
        courseTeacherService.remove(Wrappers.<EwcCourseTeacher>lambdaQuery().eq(EwcCourseTeacher::getCourseId,id)
                .eq(EwcCourseTeacher::getTeacherId,ThirdSessionHolder.getThirdSession().getId()));
    }

    @Override
    public void addRelatedCourses(ClassCourseDto classCourseDto) {
        classCourseDto.getCourseIds().forEach(item->{
            EwcClassCourse classCourse=new EwcClassCourse();
            classCourse.setClassId(classCourseDto.getClassId());
            classCourse.setCourseId(item);
            classCourseServicec.save(classCourse);
            //查询课程下的章节
            List<EwcChapter> chapters=chapterService.list(Wrappers.<EwcChapter>lambdaQuery().eq(EwcChapter::getCourseId,item).ne(EwcChapter::getStatus,0));
            if (CollectionUtil.isNotEmpty(chapters)){
                for (EwcChapter chapter : chapters) {
                    if (StringUtils.isEmpty(chapter.getClassId())) {
                        chapter.setClassId(classCourseDto.getClassId());
                        chapterService.updateById(chapter);
                    }
                }
            }

        });
    }

    @Override
    public void deleteRelatedCourses(String courseId, String classId) {
        //删除班级课程关联
        classCourseServicec.remove(Wrappers.<EwcClassCourse>lambdaQuery().eq(EwcClassCourse::getCourseId,courseId)
                .eq(EwcClassCourse::getClassId,classId));
    }
}
